﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Subgurim.Controles;
using Kohvik.Kohvikuteenus;


namespace Kohvik
{

    public partial class kohvik : System.Web.UI.Page
    {
        ServiceClient service = new ServiceClient();
        Subgurim.Controles.GMarker marker;

        //protected override void OnPreInit(EventArgs e) {
        //    base.OnPreInit(e);

        //    if (Session["kasutaja_ID"] == null || Session["kohviku_ID"] == null) {
        //        return;
        //    }

        //    int kasutaja_ID, sess_kohvikuID = -1;
        //    if (!(int.TryParse(Session["kasutaja_ID"].ToString(), out kasutaja_ID) && int.TryParse(Session["kohviku_ID"].ToString(), out sess_kohvikuID))) {
        //        return;
        //    }

        //    if (Request["kohvikID"] == null) {
        //        return;
        //    }

        //    int kohviku_ID;
        //    if (!(int.TryParse(Request["kohvikID"].ToString(), out kohviku_ID))) {
        //        return;
        //    }

        //    if (service.getUserRoleId(kasutaja_ID) == 2 || kohviku_ID == sess_kohvikuID) {
        //        //kasutajal on õigused selle kohviku andmete muutmiseks
        //        Response.Redirect("muudatused.aspx?kohvikID=" + kohviku_ID);
        //    }

        //}


        protected void Page_Load(object sender, EventArgs e)
        {
            String id = Request["kohvikID"];
            int kohvikId;
            if (!int.TryParse(id, out kohvikId))
            {
                return;
            }

            EntityKohvik kohvik = service.getEntityKohvikById(kohvikId);

            if (kohvik == null)
                return;

            String date = Request["date"];
            if (date == null) { date = DateTime.Today.ToString("yyyy-MM-dd"); }

            try
            {
                marker = new Subgurim.Controles.GMarker(new GLatLng(double.Parse(kohvik.Latitude, new System.Globalization.CultureInfo("en-US")), double.Parse(kohvik.Longitude, new System.Globalization.CultureInfo("en-US"))));
                GMap1.addGMarker(marker);
                GMap1.setCenter(marker.point, 13, Subgurim.Controles.GMapType.GTypes.Normal);
            }
            catch (Exception) { }

            string scriptText = "<script type='text/javascript'>function toggle(showHideDiv) { var elem = document.getElementById(showHideDiv); if (elem.style.display == 'block') { elem.style.display = 'none'; } else { elem.style.display = 'block'; subgurim_GMap1.setCenter(new GLatLng(" + (double.Parse(kohvik.Latitude, new System.Globalization.CultureInfo("en-US")) + 0.01).ToString(new System.Globalization.CultureInfo("en-US")) + "," + (double.Parse(kohvik.Longitude, new System.Globalization.CultureInfo("en-US")) - 0.025).ToString(new System.Globalization.CultureInfo("en-US")) + "), 13, G_NORMAL_MAP); } }"
            + "function goTo(sender, args) { var s1='http://" + Request.Url.Authority + Request.Url.AbsolutePath + "?kohvikID=" + kohvikId + "&date='; var date=sender._selectedDate; var s2=date.format(sender._format); window.location = s1+s2; }</script>";
            this.ClientScript.RegisterClientScriptBlock(this.GetType(), "clientScript", scriptText);

            MenuPlaceHolder.Controls.Add(new LiteralControl(@"Menüü (" + date.Replace('-', '.') + ")"));
            PlaceHolder_name.Controls.Add(new LiteralControl(@"<p><h2 style='color:red';>" + kohvik.Nimi + "  <a href='Kommentaarid.aspx?tyyp=" + KommentaarType.Kohvik + "&id=" + id + "'>(" + service.getCommentCountFor(KommentaarType.Kohvik, kohvikId) + ")</a></h2></p><br />"));
            PlaceHolderCafeInfo.Controls.Add(new LiteralControl(@"<div style='margin-bottom:30px;'><h3>Aadress: </h3>"));
            PlaceHolderCafeInfo.Controls.Add(new LiteralControl(@"<p style='margin-left:10px; font-size:14px;'>" + kohvik.Tanav + " " + kohvik.Maja + "<br />"
            + kohvik.LinnVald + "<br />" + kohvik.Maakond + " " + kohvik.Indeks));
            PlaceHolderCafeInfo.Controls.Add(new LiteralControl(@"</div>"));
            PlaceHolder1.Controls.Add(new LiteralControl(@"<div style='clear:both;'></div>"));

            if (!loadMenuByKohvikId(kohvikId, date))
                PlaceHolder1.Controls.Add(new LiteralControl(@"<p style='font-size:16px; margin-top:30px; margin-left:20px;'>Meie oleme kohvik ilma toidu ja kohvita!</p>"));

            if (!loadOpenTimesByKohvikId(kohvikId))
                PlaceHolderOpenTimes.Controls.Add(new LiteralControl(@"<span>Avatud 24/7!</span>"));

            KohvikuKirjeldus.Text = service.getKohvikuKirjeldus(id);
        }

        
        private bool loadOpenTimesByKohvikId(int kohvikId)
        {
            List<EntityLahtiolekuAjad> ajad = service.getEntityLahtiolekuAjadByKohvikId(kohvikId);

            if (ajad == null || ajad.Count == 0)
                return false;

            PlaceHolderOpenTimes.Controls.Add(new LiteralControl("<p style='font-size:14px;'>Oleme avatud:</p>"));
            foreach (EntityLahtiolekuAjad a in ajad)
            {
                PlaceHolderOpenTimes.Controls.Add(new LiteralControl("<span style='color:#7D0101;'>" + a.Lyhend + ":</span>&nbsp;&nbsp;<span style='color:black;'>" + a.Avamisaeg.ToString().Remove(5) + " - " + a.Sulgemisaeg.ToString().Remove(5) + "</span><br />"));
            }
            return true;
        }


        /// <summary>
        /// Laeb kategooriad, toidud ja nende portsjonid.
        /// </summary>
        /// <param name="id">Kohviku id</param>
        /// <returns>True if successful, false if EntityKohvik with given id does not exist</returns>
        private bool loadMenuByKohvikId(int id, string date)
        {

            List<EntityKaup> kaubad = service.getItemData(id, date);
            if (kaubad == null)
                return false;
            List<EntityValuuta> valuutad = service.getCurrency();

            PlaceHolder1.Controls.Add(new LiteralControl(@"<div id='cafeMenuContent'>"));

            Dictionary<String, KatInf> kategooriad = new Dictionary<string, KatInf>();

            //kogub tabeli veergude nimed ja sorteerib kaubad kategooriate järgi
            foreach (EntityKaup kaup in kaubad)
            {
                KatInf inf;
                if (!kategooriad.ContainsKey(kaup.Kategooria.Nimetus))
                {
                    inf = new KatInf();
                    //inf.TColumn.Add("ID", 0);                            //debugimiseks
                    inf.TColumn.Add("Nimetus", 1);
                    kategooriad.Add(kaup.Kategooria.Nimetus, inf);
                }
                else inf = kategooriad[kaup.Kategooria.Nimetus];


                inf.Kaubad.Add(kaup);

                if (kaup.portsjonid != null)
                {
                    int veeruNr = inf.TColumn.Count;                         //hangib lisatava veeru järjekorranumbri
                    foreach (EntityPorts ports in kaup.portsjonid)
                    {
                        if (!inf.TColumn.Keys.Contains(ports.Nimetus))
                        {
                            inf.TColumn.Add(ports.Nimetus, veeruNr);
                            veeruNr++;
                        }
                    }
                }   //END if portsjonid != null         
            }       //END foreach kaubad

            //käib kõik kategooriad läbi
            foreach (KeyValuePair<String, KatInf> kat in kategooriad)
            {
                PlaceHolder1.Controls.Add(new LiteralControl("<p id='kategooria'>" + kat.Key + "</p>"));   //lisab kategooria pealkirja
                Table t = new Table();
                t.CssClass = "tabel";
                TableRow tr = new TableRow();
                TableCell tc;
                TableHeaderCell thc;
                foreach (String s in kat.Value.TColumn.Keys)
                {             //lisab tabelisse veergude nimed
                    thc = new TableHeaderCell();
                    thc.Text = s;
                    tr.Cells.Add(thc);
                }
                t.Rows.Add(tr);

                //käib kõik selle kategooria kaubad läbi
                foreach (EntityKaup k in kat.Value.Kaubad)
                {
                    int comCount = service.getCommentCountFor(KommentaarType.Kaup, k.ID);

                    tr = new TableRow();
                    //tc = new TableCell();
                    //tc.Text = k.ID.ToString();    //debugimiseks
                    //tr.Cells.Add(tc);

                    tc = new TableCell();
                    tc.Text = k.Nimetus + "<span style='color:red';><a href='Kommentaarid.aspx?tyyp=" + KommentaarType.Kaup + "&id=" + k.ID + "'> (" + service.getCommentCountFor(KommentaarType.Kaup, k.ID) + ")</a></span>";

                    tc.CssClass = "alignleft";
                    tr.Cells.Add(tc);

                    //täidab tabeli tühjade tsellukatega                   
                    for (int i = tr.Cells.Count; i < kat.Value.TColumn.Count; i++)
                    {
                        TableCell tmp = new TableCell();
                        tr.Cells.Add(tmp);
                    }

                    if (k.portsjonid != null)
                    {
                        //käib portsjonid läbi ja lisab need tabeli õigesse veergu
                        foreach (EntityPorts ports in k.portsjonid)
                        {
                            int cellNr = kat.Value.TColumn[ports.Nimetus];
                            String valuutaSymbol;
                            try
                            {
                                valuutaSymbol = valuutad.Find(item => item.Id == ports.Valuuta_ID).Lyhend;
                            }
                            catch (Exception)
                            {
                                valuutaSymbol = "";      //kui ei leia vastavat valuutat, siis ei kirjutagi tabelisse valuutasid
                            }

                            tr.Cells[cellNr].Text = ports.Hind.ToString() + valuutaSymbol;
                            if (!ports.Saadaval)
                            {
                                tr.Cells[cellNr].CssClass = "otsas";
                            }
                            else
                            {
                                tr.Cells[cellNr].CssClass = "aligncenter";
                            }

                            if (k.soodukad != null)
                            {
                                foreach (EntitySoodustus soodukas in k.soodukad)
                                {
                                    if (soodukas.Yhik.Equals("%"))
                                    {
                                        tr.Cells[cellNr].Text += "<br />" + soodukas.Liik + ": " + Math.Round((ports.Hind - ports.Hind * soodukas.Suurus / 100), 2, MidpointRounding.AwayFromZero) + valuutaSymbol;
                                    }
                                    else if (soodukas.Yhik.Equals(valuutaSymbol))
                                    {
                                        tr.Cells[cellNr].Text += "<br />" + soodukas.Liik + ": " + Math.Round((ports.Hind - soodukas.Suurus), 2, MidpointRounding.AwayFromZero) + valuutaSymbol;
                                    }
                                }
                            }
                            tr.CssClass = "aligncenter";
                        }
                    }
                    t.Rows.Add(tr);
                }
                PlaceHolder1.Controls.Add(t);
            }

            PlaceHolder1.Controls.Add(new LiteralControl(@"</div>"));

            return true;
        }


        private class KatInf
        {
            private List<EntityKaup> kaubad = new List<EntityKaup>();
            public List<EntityKaup> Kaubad
            {
                get { return kaubad; }
                set { kaubad = value; }
            }

            private Dictionary<String, int> tColumn = new Dictionary<string, int>();
            public Dictionary<String, int> TColumn
            {
                get { return tColumn; }
                set { tColumn = value; }
            }


        }

    }
}